
//****************************************************************
// Autor:   Eddy Omar Castro Jauregui - 11032
// Seccion: 10
// Nombre del Archivo: PostFix.java
// Fecha de Modificacion:17/07/2012
// Descripcion:
// Realiza las operaciones necesarias para la calculadora postfix
// ***************************************************************


public class PostFix {
    
    Stack<String> postfix = new VectorStack<String>();
    
     /** 
     * @descripcion: constructor de la clase
     * @nombre: PostFix()
     * @parametro: 
     * @retorno: 
     * @pre-condiciones:
     * @post-condiciones:
     */  
    public PostFix(){
        
    }
    
    private int tempNum, tempResultado, tamano, tempOp = 0;
    private String[] partes;
        
     /** 
     * @descripcion: realiza la operacion ingresada
     * @nombre: Operar()
     * @parametro: cadena
     * @retorno: tempResultado
     * @pre-condiciones: 
     * @post-condiciones: 
     */  
    public int Operar(String cadena){
        
        partes = cadena.split(" ");     
        tamano = partes.length;

        for (int i = 0; i<tamano; i++){
            // determinar si es numero
            try{
                tempNum = Integer.valueOf(partes[i]);
                postfix.push(partes[i]);
            }
            // casos en caso de ser operadores
            catch(NumberFormatException exception){
                if (partes[i].equals("+")){
                     tempResultado = Integer.valueOf(postfix.pop()) + Integer.valueOf(postfix.pop()) ;
                     postfix.push(String.valueOf(tempResultado));
                }
                if (partes[i].equals("-")){
                     tempOp = Integer.valueOf(postfix.pop());
                     tempResultado = Integer.valueOf(postfix.pop()) - tempOp;
                     postfix.push(String.valueOf(tempResultado));
                }
                if (partes[i].equals("*")){
                     tempResultado = Integer.valueOf(postfix.pop()) * Integer.valueOf(postfix.pop()) ;
                     postfix.push(String.valueOf(tempResultado));                     
                }
                if (partes[i].equals("/")){
                     tempOp = Integer.valueOf(postfix.pop());
                     tempResultado = Integer.valueOf(postfix.pop()) / tempOp ;
                     postfix.push(String.valueOf(tempResultado));                     
                }                
               
            }
        }        
        return tempResultado;
    }
    
     /** 
     * @descripcion: evalua si la sintaxis ingresada es correcta
     * @nombre: Evaluar()
     * @parametro: cadena
     * @retorno: true: valida; false: no valida
     * @pre-condiciones:
     * @post-condiciones:
     */  
    public boolean Evaluar(String cadena){
        partes = cadena.split(" ");     
        tamano = partes.length;

        for (int i = 0; i<tamano; i++){
            try{
                tempNum = Integer.valueOf(partes[i]);
                postfix.push(partes[i]);
            }
            // determinar que hay suficientes operandos en pila
            catch(NumberFormatException exception){
                if ((partes[i].equals("+") || partes[i].equals("-") || partes[i].equals("*") || partes[i].equals("/")) && (postfix.size()<2)) {              
                    postfix.empty();
                    return false;
                }
            }
        }
        return true;
    }
    
     /** 
     * @descripcion: revisa que no se realice una division por cero
     * @nombre: Division()
     * @parametro: cadena
     * @retorno: true: no hay; false: existe error por division
     * @pre-condiciones:
     * @post-condiciones:
     */  
    public boolean Division(String cadena){
        partes = cadena.split(" ");     
        tamano = partes.length;

        for (int i = 0; i<tamano; i++){
            try{
                tempNum = Integer.valueOf(partes[i]);
                postfix.push(partes[i]);
            }
            catch(NumberFormatException Num){
                if (partes[i].equals("/")){
                     try{
                        tempOp = Integer.valueOf(postfix.pop());
                        tempResultado = Integer.valueOf(postfix.pop()) / tempOp ;
                        postfix.empty();   
                     }
                     // atrapar una division entre cero
                     catch(ArithmeticException Div){
                         return false;
                     }
                } 
            }
        }
        return true;        
    }
    
    public void Borrar(){
        for (int i = 0; i < postfix.size(); i ++){
            postfix.pop();
        }
    }
    
     /** 
     * @descripcion: retorna un String del resultado
     * @nombre: getTempResultado()
     * @parametro: 
     * @retorno: tempResultado
     * @pre-condiciones:
     * @post-condiciones:
     */  
    public String getTempResultado(){
        return String.valueOf(tempResultado);
    }
}
